// api/image_api/image_create.go
package image_api

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"github.com/sirupsen/logrus"
	"muziai-server/utils/img"

	"io"
	"muziai-server/global"
	"muziai-server/models"
	"muziai-server/utils/jwts"
	"muziai-server/utils/res"
	"path"
	"strings"
)

func (ImageApi) ImageCreateView(c *gin.Context) {
	//c.MultipartForm() // 多个文件
	fileHeader, err := c.FormFile("file") // 单个文件
	if err != nil {
		res.FailWithMsg(c, "请选择文件")
		return
	}

	_claims, _ := c.Get("claims")
	claims := _claims.(*jwts.Claims)

	//fileHeader.Size // 1 字节 = 8 比特
	// bit 比特  B 字节  KB 千字节   MB 兆字节  GB 吉字节
	up := global.Config.Uploads
	//上传限制2mb 转 字节
	if int64(up.Size*1024*1024) < fileHeader.Size {
		res.FailWithMsg(c, "图片大小超过上传大小限制")
		return
	}

	// xxx.jpg  [xxx jpg]
	_names := strings.Split(fileHeader.Filename, ".")
	extension := "." + _names[len(_names)-1]
	if !img.InList(extension, up.WhiteList) {
		res.FailWithMsg(c, "图片后缀非法")
		return
	}
	// 读文件，算hash
	file, err := fileHeader.Open()
	//读取文件内容，不在乎名称
	byteData, _ := io.ReadAll(file)

	imageHash := img.Md5(string(byteData))
	// 判断这个hash在不在列表里面
	var image models.ImageModel
	// 如果是同一个人上传同一个hash的文件，那就没必要再创建记录了，直接把之前的webPath记录返回
	// 为什么不同用户创建相同hash的文件，要入库，是为了方便做未来用户上传的图片列表
	err = global.DB.Take(&image, "hash = ?", imageHash).Error
	if err != nil {
		// 没有，那就保存
		imagePath := path.Join(up.Path,
			fmt.Sprintf("%s%s", imageHash, extension))
		// 保存文件
		err = c.SaveUploadedFile(fileHeader, imagePath)
		if err != nil {
			logrus.Error(err)
		}
		image.FilePath = imagePath
	} else {
		if image.UserID == claims.UserID {
			res.OkWithData(c, image.WebPath())
			return
		}
	}

	// /uploads/image/xxx
	// uploads/image/xxx

	newImage := models.ImageModel{
		UserID:   claims.UserID,
		Filename: fileHeader.Filename,
		FilePath: image.FilePath, // 等于之前的
		Hash:     imageHash,
		Size:     fileHeader.Size,
	}
	err = global.DB.Create(&newImage).Error
	if err != nil {
		res.FailWithMsg(c, "创建图片记录失败")
		return
	}

	res.OkWithData(c, newImage.WebPath())
}
